package com.web.kftsdk.entity;

import com.web.kftsdk.common.util.str.StringUtils;
import lombok.Data;
import org.hibernate.validator.constraints.NotBlank;

import javax.validation.GroupSequence;
import javax.validation.groups.Default;
import java.util.Map;
import java.util.TreeMap;

/**
 * <p>Title: BaseReq</p>
 * <p>Description: 基础信息</p>
 *
 * @author xukk
 * @version 1.0
 * @date 2018/6/13
 */
@Data
public class BaseReq {
    /**
     * 参数名称:请求编号
     * 可否为空：可空
     * 参数说明：商户可以根据此参数来匹配请求和响应信息；快付通将此参数原封不动的返回给商户；
     */
    protected String reqNo;

    /**
     * 参数名称:接口名称
     * 可否为空：否
     * 参数说明：具体指定调用的接口名称,由快付通提供给商户
     */
    @NotBlank
    protected String service;

    /**
     * 参数名称:接口版本号
     * 可否为空：否
     * 参数说明：接口的版本号,便于在升级版本后,能新旧版本同时运行测试环境：1.0.0-IEST生产环境：1.0.0-PRD
     */
    @NotBlank
    protected String version;

    /**
     * 参数名称:参数字符集
     * 可否为空：否
     * 参数说明：商户发送请求时,参数值使用的编码字符集，目前只允许UTF-8
     */
    @NotBlank
    protected String charset;

    /**
     * 参数名称:语言
     * 可否为空：否
     * 参数说明：用于支持不同语言.java国际化中标准的locale值，如zh_CN表示中文，en表示英文；
     */
    @NotBlank
    protected String language;

    /**
     * 参数名称:参数签名算法
     * 可否为空：否
     * 参数说明：RSA
     */
    protected String signatureAlgorithm;

    /**
     * 参数名称:签名值
     * 可否为空：否
     * 参数说明：所有需要参与签名的请求参数,通过指定的签名算法计算后得出的字符串.具体见第5章节
     */
    protected String signatureInfo;

    protected  String callerIp;
    @GroupSequence({Default.class, Add.class})
    public interface AddCheck {
    }
    @GroupSequence({Default.class, Update.class})
    public interface UpdateCheck {
    }
    @GroupSequence({Default.class,Delete.class})
    public interface DeleteCheck{
    }
    @GroupSequence({Default.class,Query.class})
    public interface QueryCheck{
    }
    public interface Add {
    }
    public interface Update {
    }
    public interface Delete{
    }
    public interface Query{
    }
    public Map toMap(String service){
          Map<String, String> map = new TreeMap<>();
            if(!StringUtils.isBlank(reqNo)){
                map.put("reqNo",reqNo);
            }
            this.service=service;
            map.put("service",this.service);
            map.put("version",version);
            map.put("charset",charset);
            map.put("language",language);
            if(!StringUtils.isBlank(callerIp)){
                map.put("callerIp",callerIp);
            }
            return map;
    }
}
